package com.jhy.suixianglu.daima20230114;

public class ReverseWords {
    public static String reverseWords(String s) {
        // 先将首尾字符串的空格 和 中间多余的空格除掉
        char[] chars = s.toCharArray();
        chars = removeExtraSpaces(chars);
        // 将整个字符串反转
        reverse(chars, 0, chars.length - 1);

        // 将里面的单词进行反转
        reverseEachWord(chars);
        return new String(chars);
    }

    public static void reverseEachWord(char[] chars) {
        int start = 0;
        //end <= s.length() 这里的 = ，是为了让 end 永远指向单词末尾后一个位置，这样 reverse 的实参更好设置
        for (int end = 0; end <= chars.length; end++) {
            // end 每次到单词末尾后的空格或串尾,开始反转单词
            if (end == chars.length || chars[end] == ' ') {
                reverse(chars, start, end - 1);
                start = end + 1;
            }
        }
    }
    private static void reverse(char[] chars, int left, int right) {
        while (left<right){
            char temp = chars[left];
            chars[left] = chars[right];
            chars[right] = temp;
            left++;
            right--;
        }
    }

//    private static void swap(char[] chars, int i, int j) {
//        char temp = chars[i];
//        chars[i] = chars[j];
//        chars[j] = temp;
//    }

    private static char[] removeExtraSpaces(char[] chars) {
        // 定义一个慢指针
        int slow = 0;
        for (int fast = 0; fast < chars.length; fast++) {
            // 总体上是什么情况下我们进行了slow的增加 那么就是当前指针的值不为空
            if (chars[fast] != ' ') {
                // 但是我们slow位置上 单词结尾要加空格 首先执行的不用加 也就是我们的
                // 首单词的位置不加空格
                if (slow != 0) {
                    chars[slow++] = ' ';
                }
                while (fast < chars.length && chars[fast] != ' ') {
                    chars[slow++] = chars[fast++];
                }
            }
        }
        char[] newChar = new char[slow];
        System.arraycopy(chars, 0, newChar, 0, slow);
        return newChar;
    }

    public static void main(String[] args) {
        String s = "  hello world  ";
        String reverseWords = reverseWords(s);
        System.out.println(reverseWords);
    }
}
